<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 柯里化:curry
        // 柯里化:把多元参数转化成一元参数的过程
        // bind();//典型的柯里化

        // ——————————————————————————————————————————
        // 确定参数的柯里化
        // function add(a,b,c){
        //     return a + b + c;
        // }
        // // add(1,2,3) ——> add(1)(2)(3)

        // function curry(add) {
        //     return function(a){
        //         return function(b){
        //             return function(c){
        //                 return a+b+c
        //             }
        //         }
        //     }
        // }
        // let myadd = curry(add);
        // let res = myadd(1)(2)(3)
        // console.log(res);
        // ——————————————————————————————————————————

        // 处理不定参数的curry
        //这里有bug,必须给齐4个参数
        function add(a, b, c, d) {
            return a + b + c;
        }
        // add();
        // 函数的长度就是参数的个数
        // console.log(add.length);
        // 处理多参数的curry ，不定参数的curry
        // function curry(add) {
        //     return function curryFn(...args) {
        //         if (add.length > args.length) {
        //             // 如果参数不够 就继续返还 函数 ，连接传入的参数 ；
        //             return function (...args2) {
        //                 console.log(args);//arg这里是闭包了
        //                 console.log(args2);
        //                 return curryFn(...args, ...args2);//拼接后作为新的args
        //                 console.log('————————————————————————————————————');
        //             }
        //         } else {
        //             // 如果参数已经够了 ，直接执行函数返还函数结果
        //             return add(...args);
        //         }
        //     }
        // }

        // let myadd = curry(add);
        // console.log(myadd);
        // myadd

        // let res = myadd(1);
        // console.log(res);

        // console.log('————————————————————————————————————');
        // let myadd = curry(add);////返回curryFn,注意这里没有执行,这里只是单纯的封装
        // console.log(myadd(1));//匿名函数,第一遍是不进入匿名函数的
        // console.log(myadd(1)(2));//打印[2],调用匿名函数,返回的是curryFn(...args,...args2的结果),也就是有两个参的,arg这里是闭包了
        // console.log(myadd(1)(2)(3));//打印[2][3](打印2次),匿名函数
        // console.log(myadd(1)(2)(3)(4));
        // ——————————————————————————————————————————
        function add(a, b, c, d) {
            return a + b + c;
        }


        function curry(add) {
            return function curryFn(...args) {
                if (add.length > args.length) {
                    // 如果参数不够 就继续返还 函数 ，连接传入的参数 ；
                    return function (...args2) {
                        return curryFn(...args, ...args2);//拼接后作为新的args
                    }
                } else {
                    // 如果参数已经够了 ，直接执行函数返还函数结果
                    return add(...args);
                }
            }
        }


        // ——————————————————————————————————————————

    </script>
</body>

</html>